<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Evaluacion_model extends CI_Model {

    public function __construct() {
        parent::__construct();
    }
    /**
     * Verifica que el usuario y el password coincidan
     * @param string $usuario Nombre de usuario
     * @param string $pass Password
     * @return bool false si el loggin fue incorrecto true si fue correcto
     */
    function verificar_datos($usuario, $pass) {
        $query = "  select 	a_administrativo_id,
                                concat( a_nombre,' ',a_apellido) as a_nombre,
                                a_email,
                                ta.ta_tipo_administrativo_id,
                                ta.ta_tipo,
                                a_imagen
                    from administrativo a join tipo_administrativo ta 
                    on(ta.ta_tipo_administrativo_id=a.ta_tipo_administrativo_id)
                    where a.a_usuario=? and a.a_pass=?";
        $resultado = $this->db->query($query, array($usuario, $pass));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Retorna el nombre de las sucursales
     * @return array Nombre de las sucursales
     */
    function lista_sucursales() {
        $query = 'select s_sucursal_id,s_nombre from sucursal order by s_nombre asc';
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Para comenzar con la evaluación primero se crea un cuestionario que <br>
     * generará el id que se utilizará para guardar el resto de las preguntas<br>
     * @param date $c_fecha fecha de la auditoria
     * @param time $c_horario_inicio hora de inicio de la auditoria
     * @param int $c_comensales numero de comenzales en el restaurante
     * @param int $c_aforo aforo total del restaurante
     * @param int $s_sucursal_id id de la sucursal evaluada
     * @return int id del cuestionario actual
     */
    function crear_cuestionario($c_fecha, $c_horario_inicio, $c_comensales, $c_aforo, $s_sucursal_id) {
        $cuestionario = array(
            'c_fecha' => $c_fecha,
            'c_horario_inicio' => $c_horario_inicio,
            'c_comenzales' => $c_comensales,
            'c_aforo' => $c_aforo,
            's_sucursal_id' => $s_sucursal_id
        );
        $insert_query = "insert into cuestionario(c_cuestionario_id,c_fecha,c_horario_inicio,c_comensales,c_aforo,s_sucursal_id)"
                . " values(NULL,?,?,?,?,?)";
        $this->db->query($insert_query, $cuestionario);
        $query = "select max(c_cuestionario_id) as id from cuestionario";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        return $out;
    }

    /**
     * Retorna el nombre de la sucursal a la que pertenece el cuestionario
     * @param int $c_cuestionario_id
     * @return string Nombre de la sucursal
     */
    public function datos_sucursal($c_cuestionario_id) {
        $query = "select s_nombre from sucursal s join cuestionario c on(s.s_sucursal_id=c.s_sucursal_id) where c.c_cuestionario_id=$c_cuestionario_id";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        return $out;
    }

    /**
     *  Carga un subloque de las preguntas que serán aplicadas,<br>
     *  dependiendo de el tipo  de aspi, categoria y subcategoria<br>
     * @param char $c_categoria id de la categoria de las preguntas
     * @param char $s_subcategoria tipo de subcategoria A|S|P|I
     * @param int $ta_tipo_aspi_id tipo de aspi que se va a apliar
     * @return array lista de preguntas en formato de ASPI
     */
    public function carga_bloque($c_categoria, $s_subcategoria, $ta_tipo_aspi_id) {
        $query = "  SELECT p.p_pregunta_id,p.p_pregunta,p.p_pp,p.p_pc,  
                    concat(c.c_categoria,'-',p.p_matricula)  as sclave, 
                    sc.s_subcategoria,sc.s_nombre  
                    FROM pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id) 
                    join categoria c on(c.c_categoria_id=sc.c_categoria_id) 
                    join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id)
                    where c.c_categoria=? and sc.s_subcategoria=? and ta.ta_tipo_aspi_id=?";
        $resultado = $this->db->query($query, array($c_categoria, $s_subcategoria, $ta_tipo_aspi_id));
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Guarda la repuesta de una pregunta , aplica para todos los tipos de ASPI
     * @param int $c_cuestionario_id id del cuestionario actual
     * @param int $p_pregunta_id id de la pregunta actual
     * @param int $c_po puntos obtenidos para la pregunta
     * @param int $c_no_aplica puntos que se van a penalizar
     */
    public function guardar_respuesta($c_cuestionario_id, $p_pregunta_id, $c_po) {
        $query = "insert into calificacion(c_calificacion_id,c_cuestionario_id,p_pregunta_id,c_po)
                values(NULL,$c_cuestionario_id,$p_pregunta_id,$c_po)";
        $this->db->query($query);
    }

    /**
     * Actualiza la calificación de una pregunta , aplica para todos los tipos de ASPI
     * @param int $c_po nueva calificación
     * @param int $c_calificacion_id id de la calificación
     */
    public function actualiza_respuesta($c_po, $c_calificacion_id) {
        $query = "update calificacion set c_po=?
                  where c_calificacion_id=?";
        $this->db->query($query, array($c_po, $c_calificacion_id));
    }

    /* retorna la lista de los formularios ASPI
     * 
     * @return array lista de tipos ASPI
     */

    public function tipos_aspi() {
        $query = "SELECT ta_tipo_aspi_id,ta_tipo FROM tipo_aspi";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    # metodos para reporte
    /** Trae un bloque de respuestas de la categoria  y subcategoria<br>
     * especificadas, se utiliza para generar los reportes con el formato<br>
     * de los formularios ASPI 
     * @param int $ta_tipo_aspi_id id del tipo de ASPI
     * @param int $c_cuestionario_id id del cuestionario que se va a buscar
     * @param char $c_categoria tipo de categoria de A|S|P|I
     * @param char $s_subcategoria tipo de subcategoria A|B|C|D...
     * @return array lista de resultados
     */

    public function resp_xsubcat($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria) {
        $query = "  select  concat(c.c_categoria,'-',p.p_matricula)  as sclave, 
                    p.p_pregunta,
                    p.p_pp,
                    p.p_pc,
                    cal.c_po,
                    sc.s_subcategoria,
                    c.c_categoria,
                    p.p_pregunta_id,
                    cal.c_calificacion_id
                    FROM pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id)  
                    join categoria c on(c.c_categoria_id=sc.c_categoria_id)  
                    join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id)
                    join calificacion cal on(cal.p_pregunta_id=p.p_pregunta_id)
                    join cuestionario cu on(cu.c_cuestionario_id=cal.c_cuestionario_id) 
                    where ta.ta_tipo_aspi_id=? 
                    and cu.c_cuestionario_id=? 
                    and c.c_categoria=? 
                    and sc.s_subcategoria=?";
        $resultado = $this->db->query($query, array($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria));
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Retrna el resultado parcial de una subcategoria para el eporte ASPI
     * @param int $ta_tipo_aspi_id
     * @param int $c_cuestionario_id
     * @param char $c_categoria
     * @param char $s_subcategoria
     * @return object
     */
    public function parcal_xsubcat($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria) {
        $query = "  
                select 	b.puntos_amabilidad,
		(if(b.puntos_obtenidos<0,'CRITICO',b.puntos_obtenidos)) as puntos_obtenidos, 
                (if(b.puntos_obtenidos<0,'CRITICO',ROUND(((b.puntos_obtenidos/b.puntos_amabilidad)*100))))as calific, 
                b.criticos,
                b.tpobt,
                ROUND(((b.tpobt/b.puntos_amabilidad)*100)) as tcal
                from (       
                        select  sum(p.p_pp) as puntos_amabilidad,
			sum( (case cal.c_po when 0 then -1000000 else cal.c_po end) ) as puntos_obtenidos, 
			sum(case cal.c_po when 0 then 1 else 0 end) as criticos,
                        sum(cal.c_po ) as tpobt
            
			FROM pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id)  
			join categoria c on(c.c_categoria_id=sc.c_categoria_id)  
			join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id)
			join calificacion cal on(cal.p_pregunta_id=p.p_pregunta_id)
			join cuestionario cu on(cu.c_cuestionario_id=cal.c_cuestionario_id)
            
            where ta.ta_tipo_aspi_id=? 
            and cu.c_cuestionario_id=? 
            and c.c_categoria=? 
            and sc.s_subcategoria=?
            
	) as b";
        $resultado = $this->db->query($query, array($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Retorna el id de la subcategoria
     * @param char $c_categoria  A|S|P|I
     * @param char $s_subcategoria A,B,C...
     * @param int $ta_tipo_aspi_id 1,2,3
     * @return object 
     */
    public function subcatid($c_categoria, $s_subcategoria, $ta_tipo_aspi_id) {
        $query = "SELECT sc.s_subcategoria_id, sc.s_nombre   
		FROM pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id)  
		join categoria c on(c.c_categoria_id=sc.c_categoria_id)  
		join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id) 
		where c.c_categoria=? and sc.s_subcategoria=? and ta.ta_tipo_aspi_id=? 
                group by sc.s_subcategoria_id,sc.s_nombre  ";
        $resultado = $this->db->query($query, array($c_categoria, $s_subcategoria, $ta_tipo_aspi_id));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Guarda la constante de penalización de de la subcategoria y el cuestionario
     * @param int $c_cuestionario_id
     * @param int $s_subcategoria_id
     * @param int $cc_constante_control
     */
    public function guarda_penal($c_cuestionario_id, $s_subcategoria_id, $cc_constante_control) {
        $query = "insert into constante_control(c_cuestionario_id,s_subcategoria_id,cc_constante_control) values(?,?,?)";
        $this->db->query($query, array($c_cuestionario_id, $s_subcategoria_id, $cc_constante_control));
    }

    /**
     * actualiza la constante de penalización de de la subcategoria y el cuestionario
     * @param int $c_cuestionario_id
     * @param int $s_subcategoria_id
     * @param int $cc_constante_control
     */
    public function actualiza_penal($c_cuestionario_id, $s_subcategoria_id, $cc_constante_control) {
        $query = "update constante_control set cc_constante_control=?
                  where c_cuestionario_id=? and s_subcategoria_id=? ";
        $this->db->query($query, array($cc_constante_control, $c_cuestionario_id, $s_subcategoria_id));
    }

    /**
     * Retorna el resultado parcial de un subloque restando la constante de penalizacion cuando<br>
     * existe la constante de control
     * @param int $ta_tipo_aspi_id
     * @param int $c_cuestionario_id
     * @param char $c_categoria
     * @param char $s_subcategoria
     * @return objeto
     */
    public function parcal_xsubctrlcal_nn($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria, $s_subcategoria_id) {
        $query = "  
                select     b.puntos_amabilidad, 
                (if(b.puntos_obtenidos<0,'CRITICO',b.puntos_obtenidos)) as puntos_obtenidos, 
                (if(b.puntos_obtenidos<0,'CRITICO',ROUND(((b.puntos_obtenidos/b.puntos_amabilidad)*100))))as calific, 
                b.criticos,
                b.cc_constante_control
        
                from (        
                    select  sum(p.p_pp) - cc.cc_constante_control as puntos_amabilidad, 
                    sum( (case cal.c_po when 0 then -1000000 else cal.c_po end) ) as puntos_obtenidos, 
                    sum(case cal.c_po when 0 then 1 else 0 end) as criticos,
                    cc.cc_constante_control 

                    FROM pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id)   
                    join categoria c on(c.c_categoria_id=sc.c_categoria_id)   
                    join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id) 
                    join calificacion cal on(cal.p_pregunta_id=p.p_pregunta_id) 
                    join cuestionario cu on(cu.c_cuestionario_id=cal.c_cuestionario_id) 
                    left join constante_control cc on(cu.c_cuestionario_id=cc.c_cuestionario_id)

                    where ta.ta_tipo_aspi_id=?  
                    and cu.c_cuestionario_id=?  
                    and c.c_categoria=?  
                    and sc.s_subcategoria=?
                    and cc.s_subcategoria_id=?

                ) as b  ";
        $resultado = $this->db->query($query, array($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria, $s_subcategoria_id));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Retorna el resultado parcial de un subloque restando la constante de penalizacion cuando<br>
     * <b>NO existe la constante de control </b>
     * @param int $ta_tipo_aspi_id
     * @param int $c_cuestionario_id
     * @param char $c_categoria
     * @param char $s_subcategoria
     * @return objeto
     */
    public function parcal_xsubctrlcal_n($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria) {
        $query = "  
                select  b.puntos_amabilidad, 
			(if(b.puntos_obtenidos<0,'CRITICO',b.puntos_obtenidos)) as puntos_obtenidos, 
                        (if(b.puntos_obtenidos<0,'CRITICO',ROUND(((b.puntos_obtenidos/b.puntos_amabilidad)*100))))as calific,   
                        b.criticos,
                        b.tpobt,
                        ROUND(((b.tpobt/b.puntos_amabilidad)*100)) as tcal
        
                from (        
                        select  sum(p.p_pp) as puntos_amabilidad, 
                        sum( (case cal.c_po when 0 then -1000000 else cal.c_po end) ) as puntos_obtenidos,
                        sum(case cal.c_po when 0 then 1 else 0 end) as criticos,
                        sum(cal.c_po ) as tpobt 

                        FROM pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id)   
                        join categoria c on(c.c_categoria_id=sc.c_categoria_id)   
                        join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id) 
                        join calificacion cal on(cal.p_pregunta_id=p.p_pregunta_id) 
                        join cuestionario cu on(cu.c_cuestionario_id=cal.c_cuestionario_id) 
                        
                        where ta.ta_tipo_aspi_id=?  
                        and cu.c_cuestionario_id=?  
                        and c.c_categoria=?  
                        and sc.s_subcategoria=?
             
                ) as b ";
        $resultado = $this->db->query($query, array($ta_tipo_aspi_id, $c_cuestionario_id, $c_categoria, $s_subcategoria));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * retorna una lista de las subcategoria de cada categoria
     * @param int $ta_tipo_aspi_id tipo de aspi 1 domicilio,2 mostrador,3 salon
     * @param char $c_categoria categoria A|S|P|I 
     * @return objects array
     */
    public function list_subcats($ta_tipo_aspi_id, $c_categoria) {
        $query = "  select sc.s_subcategoria_id,sc.s_subcategoria,sc.s_nombre
                        from tipo_aspi ta join categoria c on(ta.ta_tipo_aspi_id=c.ta_tipo_aspi_id)
                        join subcategoria sc on(c.c_categoria_id=sc.c_categoria_id)
                        where ta.ta_tipo_aspi_id=?
                        and c.c_categoria=?";
        $resultado = $this->db->query($query, array($ta_tipo_aspi_id, $c_categoria));
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function datos_cuestionario($c_cuestionario_id) {
        $query = " select c_fecha,c_comensales,c_aforo,c_horario_inicio
                    from cuestionario where c_cuestionario_id=$c_cuestionario_id";
        $resultado = $this->db->query($query, array($c_cuestionario_id));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function plan_accion($c_cuestionario_id) {
        $query = " select   concat(cat.c_categoria,'-',pe.p_matricula) as sclave,
                            pe.p_pregunta,
                            pe.p_pregunta_id
                            from cuestionario cu join calificacion ca on(cu.c_cuestionario_id=ca.c_cuestionario_id)
                            join pregunta pe on(pe.p_pregunta_id=ca.p_pregunta_id)
                            join subcategoria sc on(pe.s_subcategoria_id=sc.s_subcategoria_id)
                            join categoria cat on(cat.c_categoria_id=sc.c_categoria_id)

                            where cu.c_cuestionario_id=?
                            and ca.c_po=0

                            order by pe.p_pregunta_id ";
        $resultado = $this->db->query($query, array($c_cuestionario_id));
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function guardar_accion($pa_no_estandar, $pa_descripcion_desviacion, $pa_accion_correctiva, $pa_fecha_cumplimiento, $pa_responsable, $c_cuestionario_id) {
        $query = "insert into plan_accion(pa_plan_accion_id,pa_no_estandar,pa_descripcion_desviacion,pa_accion_correctiva,pa_fecha_cumplimiento,pa_responsable,c_cuestionario_id)
                    values(NULL,?,?,?,?,?,?)";
        $this->db->query($query, array($pa_no_estandar, $pa_descripcion_desviacion, $pa_accion_correctiva, $pa_fecha_cumplimiento, $pa_responsable, $c_cuestionario_id));
    }

    public function update_accion($pa_descripcion_desviacion, $pa_accion_correctiva, $pa_fecha_cumplimiento, $pa_responsable, $pa_plan_accion_id) {
        $query = "  update plan_accion set  pa_descripcion_desviacion=?,
                                            pa_accion_correctiva=?,
                                            pa_fecha_cumplimiento=?,
                                            pa_responsable=?
                    where   pa_plan_accion_id=?";
        $this->db->query($query, array($pa_descripcion_desviacion, $pa_accion_correctiva, $pa_fecha_cumplimiento, $pa_responsable, $pa_plan_accion_id));
    }

    public function lista_acciones($c_cuestionario_id) {
        $query = " select pa_no_estandar,pa_descripcion_desviacion,pa_accion_correctiva,pa_fecha_cumplimiento,pa_responsable 
                    from plan_accion where c_cuestionario_id=?  order by pa_no_estandar";
        $resultado = $this->db->query($query, array($c_cuestionario_id));
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function lista_cuestionarios() {
        $query = "SELECT    	c.c_cuestionario_id,
			s.s_nombre,
			c.c_fecha,
			c.c_horario_inicio,
			c.c_comensales,
			c.c_aforo,
			ta.ta_tipo_aspi_id,
			ta.ta_tipo,
                        a.tPreg
            FROM sucursal s 
            join cuestionario c on(c.s_sucursal_id=s.s_sucursal_id)
            join calificacion cal on(c.c_cuestionario_id=cal.c_cuestionario_id)
            join pregunta p on(p.p_pregunta_id=cal.p_pregunta_id)
            join subcategoria sc on (sc.s_subcategoria_id=p.s_subcategoria_id)
            join categoria cat on(cat.c_categoria_id=sc.c_categoria_id)
            join tipo_aspi ta on(ta.ta_tipo_aspi_id=cat.ta_tipo_aspi_id)
            join (	select 	count(*) as tPreg, c.ta_tipo_aspi_id
                            from pregunta p 
                            join subcategoria sc on (sc.s_subcategoria_id=p.s_subcategoria_id)
                            join categoria c on(sc.c_categoria_id=c.c_categoria_id)		
                            group by c.ta_tipo_aspi_id 	) as a on(ta.ta_tipo_aspi_id=a.ta_tipo_aspi_id)
            group by c.c_cuestionario_id
            having count(cal.c_calificacion_id)=tPreg
            order by c.c_cuestionario_id desc";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function const_control($c_categoria, $s_subcategoria, $ta_tipo_aspi_id, $c_cuestionario_id) {
        $query = "select    sc.s_subcategoria_id, 
                            sc.s_nombre,
                            cc.cc_constante_control
		from pregunta p join subcategoria sc  on(p.s_subcategoria_id=sc.s_subcategoria_id)  
		join categoria c on(c.c_categoria_id=sc.c_categoria_id)  
		join tipo_aspi ta on(c.ta_tipo_aspi_id=ta.ta_tipo_aspi_id) 
                join constante_control cc on(cc.s_subcategoria_id=sc.s_subcategoria_id)
                 
		where c.c_categoria=? and sc.s_subcategoria=? and ta.ta_tipo_aspi_id=? 
                and cc.c_cuestionario_id=?         
                group by sc.s_subcategoria_id, sc.s_nombre ";
        $resultado = $this->db->query($query, array($c_categoria, $s_subcategoria, $ta_tipo_aspi_id, $c_cuestionario_id));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function verifica_plan($c_cuestionario_id, $pa_no_estandar) {
        $query = "SELECT pa_plan_accion_id,pa_no_estandar,c_cuestionario_id, count(*) as t 
                FROM plan_accion where c_cuestionario_id=? and pa_no_estandar=?";
        $resultado = $this->db->query($query, array($c_cuestionario_id, $pa_no_estandar));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Elimina aquellos elementos que no se encuentren en la lista especificada 
     * de standares de un cuestionario 
     * @param int $c_cuestionario_id id del cuestionario que se va a trabajar
     * @param string $white_list lista de elementos que no serán eliminados
     */
    public function purge($c_cuestionario_id, $white_list) {
        $query = "  delete from plan_accion 
                    where c_cuestionario_id=$c_cuestionario_id 
                    and pa_no_estandar not in($white_list)";
        $this->db->query($query);
    }

    public function full_purge($c_cuestionario_id) {
        $query = "  delete from plan_accion 
                    where c_cuestionario_id=$c_cuestionario_id ";
        $this->db->query($query);
    }

    public function plan_accion_data($c_cuestionario_id) {
        $query = "SELECT  pa.pa_plan_accion_id,
                        pa.pa_no_estandar,
                        pa.pa_descripcion_desviacion,
                        pa.pa_accion_correctiva,
                        pa.pa_fecha_cumplimiento,
                        pa.pa_responsable,
                        p.p_pregunta
                FROM plan_accion pa join cuestionario cu on(pa.c_cuestionario_id=cu.c_cuestionario_id) 
                join calificacion ca on(ca.c_cuestionario_id=cu.c_cuestionario_id)
                join pregunta p on(p.p_pregunta_id=ca.p_pregunta_id)
                where ca.c_cuestionario_id=$c_cuestionario_id
                group by pa.pa_plan_accion_id
                order by pa.pa_no_estandar";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    function insertCaptcha($captcha_time, $ip_address, $word) {
        $query = "insert into captcha(captcha_id,captcha_time,ip_address,word)
                values(NULL,?,?,?)";
        $this->db->query($query, array($captcha_time, $ip_address, $word));
    }

    function deleteCaptcha($ip_address) {
        $this->db->query("delete from captcha where ip_address = '$ip_address'");
    }

    function captchaExist($binds) {
        $sql = "select count(*) as count from captcha where word = ? and ip_address = ? and captcha_time > ?";
        $query = $this->db->query($sql, $binds);
        $row = $query->row();

        if ($row->count == 0)
            return FALSE;
        else
            return TRUE;
    }

}
